昨天有嘗試將驗證字串編碼,但還是容易被逆向找到程式邏輯並繞過。今天嘗試透過 Fuzzing 將程式位元反轉使得 Debugger 無法逆向。
如下圖,Bash 可以直接執行該程式,而 GDB 與 Radare 2 無法開啟。
使用 Fuzzing 以達成 Parser Differential Attack
Parser Differential Attack 是什麼?
makes modifications to the ELF file such that it will still execute fine, but the disassembler/debugger will not work properly if you loads a binary into it. Similar techniques can be done on other file format like Portable Executable (PE) as well.
透過比對被 fuzzing (將隨機位元交換)檔案的 output,達到可以執行原本程式,但無法使用 Debugger 開啟。
import random
import os
os.system("cp license_2 license_2_fuzz")
def flip_byte(in_bytes):
i = random.randint(0,len(in_bytes))
c = chr(random.randint(0,0xFF))
return in_bytes[:i]+c+in_bytes[i+1:]
def copy_binary():
with open("license_2", "rb") as orig_f, open("license_2_fuzz", "wb") as new_f:
new_f.write(flip_byte(orig_f.read()))
def compare(fn1, fn2):
with open(fn1) as f1, open(fn2) as f2:
return f1.read()==f2.read()
def check_output():
os.system("(./license_2_fuzz ; ./license_2_fuzz AAAA-Z10N-42-OK) > fuzz_output")
return compare("orig_output", "fuzz_output")
def check_gdb():
os.system("echo disassemble main | gdb license_2_fuzz > fuzz_gdb")
return compare("orig_gdb", "fuzz_gdb")
def check_radare():
os.system('echo -e "aaa\ns sym.main\npdf" | r2 license_2_fuzz > fuzz_radare')
return compare("orig_radare", "fuzz_radare")
while True:
copy_binary()
if check_output() and not check_gdb() and not check_radare():
print "FOUND POSSIBLE FAIL\n\n\n"
os.system("tail fuzz_gdb")
os.system("tail fuzz_radare")
raw_input()
GDB 無法逆向(如下圖)
我們可以發現,在 GDB 使用 info func 與 disassemble main 都無法執行了。
這樣就無法被 Debugger 逆向了XD 明天接著介紹 韓國 - 逆向 的題目。